#!/usr/bin/env python
#
# ==================================================================
#
# Copyright (c) 2005-2012 Parallels IP Holdings GmbH
# All Rights Reserved; http://www.parallels.com
#
# ==================================================================
#


import plistlib
import os
import shutil
import sys
import tempfile
import syslog

EXTENSIONS_FILE = 'Library/Safari/Extensions/Extensions.plist'


def add_safari_extension (ext_path, home):
    """
    Install specified Safari extension
    """

    tmp_fd, tmp_file = tempfile.mkstemp()
    safari_ext_file = os.path.join(home, EXTENSIONS_FILE)
    safari_ext_dir = os.path.dirname(safari_ext_file)
    ext_base = os.path.basename(ext_path)
    plist = {'Installed Extensions':[], 'Available Updates':[], 'Version':1}
    syslog.syslog(syslog.LOG_INFO, 'Installing extension "%s" to "%s"' % (ext_path, home))

    try:
        # Check Extensions directory exists for given user
        if not os.path.exists(safari_ext_dir):
            if os.system('mkdir -p "%s"' % safari_ext_dir):
                syslog.syslog(syslog.LOG_ERR, 'Can\'t create extensions folder')
                return 1
        # Check if Extensions .plist exists for given user
        elif os.path.exists(safari_ext_file):
            # Convert Extensions.plist to XML format to plistlib can parse it
            if os.system('/usr/bin/env plutil -convert xml1 -o "%s" "%s"' % (tmp_file, safari_ext_file)):
                syslog.syslog(syslog.LOG_ERR, 'Can\'t execute plutil')
                return 1

            # Read Extensions info
            plist = plistlib.readPlist(tmp_file)

        # Check for extension already installed
        for ext in plist['Installed Extensions']:
            if ext['Archive File Name'] == ext_base:
                syslog.syslog(syslog.LOG_INFO, "Extension already installed (%s)" % home)
                os.remove(tmp_file)
                return 0

        # Add our extension to a plist
        plist['Installed Extensions'] += [
        {
            'Archive File Name': ext_base,
            'Enabled': True,
            'Bundle Directory Name': '%s.safariextension' % '.'.join(ext_base.split('.')[0:-1])
        }]

        # Write modified extensions info to tempopary file
        plistlib.writePlist(plist, tmp_file)

        # Convert temporary plist to binary format
        if os.system('/usr/bin/env plutil -convert binary1 -o "%s" "%s"' % (safari_ext_file, tmp_file)):
            syslog.syslog(syslog.LOG_ERR, 'Can\'t execute plutil')
            return 1

        # Copy extension to Extensions dir
        shutil.copyfile(ext_path, '%s' % os.path.join(safari_ext_dir, ext_base))
        syslog.syslog(syslog.LOG_INFO, "Extension installed (%s)" % home)
        return 0

    except Exception, e:
        syslog.syslog(syslog.LOG_ERR, 'Can\'t install extension: %s' % str(e))

    finally:
        if os.path.exists(tmp_file):
            os.remove(tmp_file)

    return 1


if __name__ == '__main__':
    if len(sys.argv) != 3:
        syslog.syslog(syslog.LOG_ERR, 'Incorrect CL')
        print 'Error: extensions path or path to home not specified'
        print 'Usage: %s <extension path> <path_to_home>' % sys.argv[0]
        sys.exit(1)

    sys.exit(add_safari_extension(sys.argv[1], sys.argv[2]))
